sabato, gennaio 19, 2008

Porte di MSN e Live Messenger


MSN Messenger (fino alla versione 7.5, ultima compatibile con Windows 2000) usa le seguenti porte:
  • 1863 TCP e UDP per i messaggi ed il log in;
  • 6891-6900 TCP per scambio file (max 10, uno per porta);
  • 5190 UDP
  • 6901 TCP+TCP per la voce

Windows Live Messenger (versioni 8.0,8.1 e 8.5) usa invece:

  • 1863 TCP e UDP per i messaggi ed il log in;
  • 6891-6900 TCP per scambio file (max 10, uno per porta);
  • 12352 UDP
  • 6901 TCP+TCP per la voce
  • 14300 TCP
  • 7790 UDP
La serie di porte 6891-6900 TCP serve per lo scambio file, e, se desiderate permettere un solo scambio file per utente nella rete privata, aprite solo la prima porte, cioè la 6891; per due scambi simultanei anche la seconda e così via.

Filtri IP "trasparenti"


Abitualmente si consiglia di non promuovere controller di dominio un server che fa già il routing fra reti, ma per chi avesse una disponibilità limitata di macchine e di spesa, c'è la soluzione per la buona convivenza dei due servizi.
Prendiamo in considerazione Windows Server 2003, ma la soluzione qui spiegata funziona sia sul predecessore (Windows 2000 Server) sia sul successore (Windows Server 2008).

Per fare si che i pc entrino in dominio le porte del controller di dominio verso la rete locale devono essere tutte aperte e il DNS deve pubblicare l'indirizzo IP locale.
Per configurare correttamente il DNS bisogna aggiungere alòò registro di sistema le chiavi:
  • Value name: PublishAddresses
    Data type: REG_SZ
    Value data: IP address of the server's local network adapter. If you have to specify more than one IP address, separate the addresses with spaces.
    IN
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\...
    DNS\Parameters
  • Value name: RegisterDnsARecords
    Data type: REG_DWORD
    Value data: 0
    IN
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\...
    Netlogon\Parameters
Riavviare quindi il servizio DNS.
Ora dobbiamo aggiungere (se non è gia esistente) il record A nel DNS che contiene l'indirizzo IP interno del server: clicchiamo sul nome del nostro dominio in Forward Lookup Zones e dal menu Azioni selezioniamo New Host (A)... . Lasciare il nome dell'host vuoto, inserire l'ip interno e cliccare anche su Create Associated PTR Record e dare OK. Nella stessa cartella facciamo la stessa cosa sotto MSDCS \ GC. Ignorate i messaggi di warning.
Nel sito Microsoft Support c'è la soluzione anche per server WINS.

Ora, se nel servizio di Routing e Accesso Remoto avete impostato dei filtri per connessione Internet, lo avrete fatto certamente sull'interfaccia interna, perchè su quella esterna (connessa al router ADSL) impostare dei filtri significa bloccare la connettività in uno o in un altro verso, inoltre questa è l'interfaccia su cui è attivo il NAT, per cui se si filtrano alcune porte e l'IP esterno del server, è come se i filtri sulle porte non ci fossero, perchè il NAT lavora considerando i filtri tutti allo stesso livello.
Per ovviare al problema basta quindi aggiungere ai filtri interni (l'interfaccia che non ospita il NAT) l'indirizzo IP interno del server. Se ad esempio i filtri sono impostati su quelli in uscita, allora bisognerà aggiungere questa voce:
Rete di Origine: 192.168.0.1 (è, ad es., l'ip del server interno)
Net Mask: 255.255.255.255 (perchè stiamo parlando di machera di rete, non di sottorete).
Dare OK.

In questo modo il server apre tutte le sue porte all'interno della rete, pur continuando a filtrare il traffico Internet che proviene dalla scheda esterna. I filtri saranno tanto più invisibili quanto sarete precisi nell'aprire tutto il set di porte necessarie; inoltre è consigliabile lasciare passare tutte le comunicazioni ICMP.

venerdì, gennaio 04, 2008

IIS, FastCGI e PHP


Da diverso tempo orami Microsoft mette e disposizione per chi vuole far girare il PHP su IIS 6.0 l'estensione FastCGI, che permette di far girare in modo veloce e senza intoppi le pagine PHP sul server.

Il modello CGI infatti, oramai superato, generava nel server un nuovo processo per ogni operzione che le pagine PHP chiedevano al web server, e quindi risultava molto lento e dispendioso come risorse.
Installare il PHP come ISAPI invece faceva sì che l'interprete PHP girasse come un thread interno a IIS. Peccato però che alcune estensioni del PHP non siamo thread-safe, il che può generare l'interruzione del servizio web.

Per ovviare a tutti questi inconvenienti ecco FastCGI, che unisce performance a stabilità permettendo ad un processo stile CGI di restare attivo per le richieste successive.
L'installazione non è molto intuitiva e per questo pubblico una breve setup guide.
Prima di tutto scaricare ad installare il pacchetto ed estrarre il PHP in C:\php. Poi posizionarsi in "C:\windows\system32\inetsrv\" e dal prompt dei comandi eseguire una per una queste istruzioni:


  • cscript fcgiconfig.js -add -section:"PHP" -extension:php -path:"C:\PHP\php-cgi.exe"

  • cscript fcgiconfig.js -set -section:"PHP" -InstanceMaxRequests:10000

  • cscript fcgiconfig.js -set -section:"PHP" -EnvironmentVars:PHP_FCGI_MAX_REQUESTS:10000

che vanno a moificare il file fcgiext.ini nella stessa cartella, configurando l'estensione per tutti i siti web. E' anche possibile configurare FastCGI per un solo sito di IIS; per questo consultare la guida in linea.


Ora dobbiamo dire a IIS che le pagine con estensione PHP vengano date a FastCGI. Per fare ciò avviare inetmgr.exe e dalle proprietà del sito principale cliccare prima su Home directory nelle schede e poi nel pulsante Configurazione... . Nella schermata che appare cliccare su Aggiungi... e come eseguibile dare "C:\windows\system32\inetsrv\fcgiext.dll", come estensione ".php", come verbi "GET,HEAD,POST" e dare ok, avendo cura di controllare che i due check a fine maschera siano selezionati.


Ora non rimane che impostare il file C:\php\php.ini come già pubblicato più volte in questo blog, lasciando però commentata la voce cgi.redirect.
Per provare l'installazione basta usare il solito:

Buon lavoro.

mercoledì, gennaio 02, 2008

Virtual Cluster 2008!

Torno ad occuparmi un po' dei cluster...
Riguardo alle tecnologie di parallelizzazione di un programma, si ricorda che questo deve essere adatto allo scopo, e cioè deve presentare la possibilità di dividere l'onere computazionale in più threads (il processo è l'immagine in RAM del programma, mentre il thread è l'unitò granulare in cui un processo è suddiviso) i quali, per farla breve, possono essere distribuiti su più unità logiche.

Per chi inoltre si domandasse il perchè di riscrivere un programma per l'esecuzione in cluster, basti sapere che un processo, per essere eseguito dopo essere stato compilato con un compilatore "comune", ha bisogno di "andare a parare" su una singola unità logica che lo gestisca. La parallelizzazione è attuata attraverso l'implementazione ad esempio di un protocollo di comunicazione fra diverse macchine, come le librerie MPI. Le virtual machine che girano in cluster non esistono appunto per questo motivo e per il fatto che "emulare" un processore farebbe colare a picco le prestazioni (provate a installare Virtual PC sopra una macchina virtuale in Vmware e poi raccontatemi...).

Tornando a noi, mi occuperò in questo articolo di definire degli scenari per l'esecuzione di codice parallelo attraverso l'uso (e quindi la preventiva costruzione) di cluster adatti allo scopo.
Fra le infinite possibilià offerte dal mercato dei software e dal mondo OSS, mi sento di portare all'attenzione due di queste, caratterizzate prevalentemente da facilità e velocità di implementazione. Parto inoltre dal presupposto che il parco macchine usato per il cluster sia un ambiente Windows, con pc relativamente recenti e collegati con Ethernet 10/100, scenario molto tipico in aziende e istituti di educazione e/o ricerca).

Il primo scenario proposto prevede la costruzione di una macchina SMP (Symmetric Multi-Processing, che è il modo per mettere più CPU in parallelo usato dai recenti processori multi-core) con OpenMOSIX, progetto purtroppo non più seguito dagli sviluppatori dal 1° dicembre 2007. L'idea è quella di eseguire in Vmware Server 1.0 (che è gratuito) il sistema operativo ClusterKNOPPIX o ParallelKNOPPIX, che costituirà il nodo principale del cluster. Per usare tutte le altre macchine Windows, si può installare e configurare coMosix, che è bene configurare prima di fare il boot della virtual machine con Linux. Per la configurazione seguire il tutorial nel sito del pacchetto (niente di particolarmente difficile).
Abbiamo così a disposizione una macchina SMP in Linux, il tutto senza intaccare le installazioni Windows. Questo scenario è efficace fino a 16 macchine, dopodichè le prestazioni calano in picchiata. Inoltre è possibile usare la configurazione di rete già esistente. Consiglio di avviare manualmente (in locale o in remoto) il servizio di coMosix, per evitare che il processore fisico di ogni machcian venga occupato inutilmente se Linux (nodo principale del cluster) non è in funzione (questo per evitare usi indesiderati della CPU host, perchè la rete usata dal cluster è la stessa di quella fisica e inoltre il "padre" di coMosix, coLinux, occupa permanentemente una CPU su due in Pentium 4).
Da ricordare infine che il cluster così costruito è una macchina SSI (cfr. tassonomia di Flynn), e può essere usato con programmi che sono compilati per CPU multicore.

Il secondo scenario proposto riguarda la recente possibilità di usare il nuovo Windows Server Cluster Edition (o il nuovo Windows 2008 HPC), che gira solo su piattaforme a 64 bit. L'idea qui è di distribuire in ogni macchina Virtual Server 2005 R2 Sp1 (la versione Standard fa al caso nostro) e una installazione virtuale del sistema operativo suddetto. Va da sè che le macchine host devono avere il sistema operativo a 64 bit per poterlo ospitare, e le prestazioni migliori sono raggiunte se hanno anche 4GB di RAM, di modo che possiamo attivare da BIOS la virtualizzazione assistita tramite hardware. In questo modo ancora una volta non si intacca l'installazione e la configurazione delle macchine host, anche se la procedura è più onerosa in termini di tempo. Per chi avesse tutte le installazioni di Windows a 32 bit, allora la scappatoria sta nel fatto di usare Vmware per l'emulazione, che permette di installare anche OS a 64 bit se il processore fisico supporta queste istruzioni). I vantaggi della piattaforma Microsoft sono la maggior scalabilità e le migliori prestazione del cluster, che differisce da OpenMOSIX per efficienza e sistema di distribuzione del carico (è molto simile ad un grid). Conviene preparate un'immagine quorum del disco in formato VHD da distribuire fra le macchine, magari con SysPrep per eseguire il mini-setup iniziale. L'emulazione va fatta con due schede di rete virtuali, una che comunica con l'esterno al solo scopo di raggiungere il controller di dominio esistente in azienda, e l'altra, con sottorete diversa, per le comunicazione del cluster. Per coloro i quali la sicurezza del cluster non è un problema, basta la rete locale normale (se il cluster però è di tipo load balancing o fail-over, separare le interfacce è consigliato). Una volta terminata la distribuzione, seguire i wizard di installazione del cluster, particolamente semplici e intuitivi. Credo appaia ovvio che questo tipo di installazione pesa molto di più nelle macchine host di quella precedente, ma ha il vantaggio, per alcuni forse fondamentale, di poter eseguire codice parallelo in macchine Windows.

Infine segnalo per completezza la Sun N1 Grid Engine, che ha prestazioni vicine al secondo scenario, e altri modi per usare Windows in cluster come quello offerto dalla software house Digipede.

Per chi come me fosse interessato a far girare Matlab in un cluster, allora è possibile usarlo, nella edizione per Linux, con il primo scenario, poichè dalla versione 2007a Matlab supporta gli SMP (particolarmente adatta al calcolo in parallelo è l'inversione di matrici); dato comunque che il riconoscimento dei processori disponibili nel cluster non è così automatico, alcuni suggeriscono di usare tool come JavaParty o JavaPorts per eseguire vecchie versioni di Matlab in parallelo. Indico anche altre possibilità in Matlab a livello di codice, come la Distributed Computing Engine (integrata), oppure le librerie MPICH per Matlab.